home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / graphic / frasr182.zip / FR8514A.ASM < prev    next >
Assembly Source File  |  1992-11-17  |  51KB  |  2,066 lines

  1.  
  2.  
  3. IFDEF ??version
  4.     MASM51
  5.     QUIRKS
  6. ENDIF
  7.  
  8.     .MODEL    medium,c
  9.  
  10.     .8086
  11.  
  12.  
  13.  
  14. HOPEN    equ    8
  15. HSMX    equ    9
  16. HINT    equ    16
  17. HLDPAL    equ    19
  18. HBBW    equ    21
  19. HBBR    equ    23
  20. HBBCHN    equ    24
  21. HBBC    equ    25
  22. HQMODE    equ    29
  23. HRECT    equ    32
  24. HCLOSE    equ    34
  25. HINIT    equ    48
  26. HSYNC    equ    49
  27. HSPAL    equ    57
  28. HRPAL    equ    58
  29.  
  30.  
  31. HLINE    equ    0
  32. HSCOL    equ    7
  33.  
  34.  
  35. .DATA
  36.  
  37.     extrn    sxdots:word, sydots:word  ; number of dots across and down
  38.     extrn    dacbox:byte, daccount:word
  39.  
  40. afiptr        dd    0
  41.  
  42. xadj        dw    0
  43. yadj        dw    0
  44.  
  45. extrn        paldata:byte        ; 1024-byte array (in GENERAL.ASM)
  46.  
  47. extrn        stbuff:byte        ; 415-byte array (in GENERAL.ASM)
  48.  
  49. linedata    db    0
  50.  
  51. hopendata    db    3, 0, 0, 0, 0
  52. hclosedata    dw    2, 0
  53. hinitdata    dw    2, 0
  54. bbw        dw    10, 8, 0, 1, 0, 0
  55. bbr        dw    12, 8, 0, 1, 0, 0, 0
  56. smx        dw    2, 0
  57. chn        dw    6
  58.         dd    linedata
  59.         dw    1
  60. pal        dw    10, 0, 0, 256
  61.         dd    paldata
  62. hidata        dw    4, 0, 8000h
  63. amode        dw    18, 9 dup(?)
  64.  
  65.  
  66. hlinedata    dw    8, 0, 0, 0, 0
  67. hscoldata    dw    4, 0, 0
  68.  
  69.  
  70. .CODE    VIDEO_TEXT
  71.  
  72.  
  73. callafi proc    near
  74.  
  75.     push    ds        ; Pass the parameter pointer
  76.     push    si
  77.  
  78.     shl    ax,1        ; form offset from entry no. required
  79.     shl    ax,1
  80.     mov    si,ax
  81.  
  82.     les    bx, afiptr    ; entry block address to es:bx
  83.     call    dword ptr es:[bx][si]     ; call entry point
  84.  
  85.     ret            ; return to caller
  86.  
  87. callafi endp
  88.  
  89.  
  90. getafi    proc    near
  91.  
  92.     mov    ax,357fh    ; read interrupt vector 7f
  93.     int    21h
  94.     mov    ax,es
  95.     or    ax,bx        ; is 7f vector null
  96.     stc
  97.     jz    getafiret
  98.  
  99.     mov    ax,0105h    ; get Interface address
  100.     int    7fh        ; by software interrupt 7f
  101.  
  102.     jc    getafiret        ; Interface not OK if carry set
  103.  
  104.     mov    word ptr afiptr,dx    ; save afi pointer offset
  105.     mov    word ptr afiptr+2,cx    ; save afi pointer segment
  106.  
  107.     clc            ; clear carry flag
  108.  
  109. getafiret:
  110.     ret            ; return to caller
  111.  
  112. getafi endp
  113.  
  114.  
  115. do85open proc    near
  116.  
  117.     push    ax
  118.     mov    ax, HOPEN
  119.     call    callafi
  120.  
  121.     mov    ax, offset stbuff    ;get the state segment
  122.     add    ax, 15
  123.     mov    cl, 4
  124.     shr    ax, cl
  125.  
  126.     mov    bx, ds
  127.     add    ax, bx
  128.  
  129.     mov    si, offset hinitdata
  130.     mov    [si] + 2, ax
  131.  
  132.     pop    ax
  133.     call    callafi
  134.  
  135.     clc
  136.     ret
  137.  
  138. do85open    endp
  139.  
  140.  
  141. open8514    proc    near
  142.  
  143.     call    load8514dacbox    ; load dacbox for 8514/A setup  JCO 4/6/92
  144.  
  145.     call    getafi        ;get adapter interface
  146.     jc    afinotfound
  147.  
  148.     mov    bl, 0        ;if > 640 x 480 then 1024 x 768
  149.  
  150.     mov    ax, sxdots
  151.  
  152.     cmp    ax, 1024    ;if > 1024, don't use afi, JCO 4/4/92
  153.     ja    afinotfound
  154.  
  155.     cmp    ax, 800    ; must be 1024
  156.     ja    setupopen
  157.  
  158.     cmp    ax, 640    ; could be 800
  159.     ja    afinotfound
  160.  
  161.     mov    ax, sydots
  162.     cmp    ax, 480
  163.     ja    setupopen
  164.  
  165.     inc    bl
  166.  
  167. setupopen:
  168.  
  169.     mov    si, offset hopendata    ;open the adapter
  170.     mov    byte ptr [si + 2], 40h        ;zero the image but leave pallette
  171.     mov    [si + 3], bl
  172.     mov    ax, HINIT        ;initialize state
  173.  
  174.     call    do85open
  175.     jc    afinotfound
  176.  
  177.     mov    si, offset amode    ;make sure on the size
  178.     mov    ax, HQMODE        ;get the adapter mode
  179.     call    callafi
  180.  
  181.     mov    ax, amode + 10        ;get the screen width
  182.     cmp    ax, sxdots
  183.     jae    xdotsok         ;check for fit
  184.     mov    sxdots, ax
  185. xdotsok:
  186.     sub    ax, sxdots        ;save centering factor
  187.     shr    ax, 1
  188.     mov    xadj, ax
  189.  
  190.     mov    ax, amode + 12        ;get the screen height
  191.     cmp    ax, sydots
  192.     jae    ydotsok
  193.     mov    sydots, ax
  194. ydotsok:
  195.     sub    ax, sydots
  196.     shr    ax, 1
  197.     mov    yadj, ax
  198.     clc
  199.     ret
  200.  
  201. afinotfound:                ; No 8514/A interface found
  202.     stc                ; flag bad mode
  203.     ret                ;  and bail out
  204.  
  205. open8514    endp
  206.  
  207. reopen8514    proc    near
  208.  
  209.     mov    si, offset hopendata    ;open the adapter
  210.     mov    byte ptr [si + 2], 0C0h     ;zero the image but leave pallette
  211.     mov    ax, HSYNC        ;initialize state
  212.     call    do85open
  213.     ret
  214.  
  215. reopen8514    endp
  216.  
  217.  
  218. close8514    proc    near
  219.  
  220.     mov    si, offset hclosedata        ;turn off 8514a
  221.     mov    ax, HCLOSE
  222.     call    callafi
  223.  
  224.     ret
  225.  
  226. close8514    endp
  227.  
  228.  
  229. fr85wdotnew    proc    near    uses si
  230.  
  231.     mov    byte ptr [hscoldata + 2], al
  232.  
  233.     add    cx, xadj
  234.     add    dx, yadj
  235.  
  236.     mov    hlinedata + 2, cx
  237.     mov    hlinedata + 4, dx
  238.     inc    cx        ; increment x direction
  239.     mov    hlinedata + 6, cx
  240.     mov    hlinedata + 8, dx
  241.  
  242. ; set the color
  243.     mov    si, offset hscoldata
  244.     mov    ax, HSCOL
  245.     call    callafi
  246.  
  247. ; plot the point
  248.     mov    si, offset hlinedata
  249.  
  250.     mov    ax, HLINE
  251.     call    callafi
  252.  
  253.     ret
  254.  
  255. fr85wdotnew    endp
  256.  
  257.  
  258. fr85wdot    proc    near uses si
  259.  
  260.     mov    linedata, al
  261.  
  262.     mov    bbw + 4, 1        ;define the rectangle
  263. ;    mov    bbw + 6, 1
  264.     add    cx, xadj
  265.     add    dx, yadj
  266.  
  267.     mov    bbw + 8, cx
  268.     mov    bbw + 10, dx
  269.     mov    si, offset bbw
  270.     mov    ax, HBBW
  271.     call    callafi
  272.  
  273.     mov    si, offset chn
  274.     mov    word ptr [si + 2], offset linedata
  275.     mov    word ptr [si + 6], 1    ;send the data
  276.  
  277.     mov    ax, HBBCHN
  278.     call    callafi
  279.  
  280. fr85wdotx:
  281.     ret
  282.  
  283. fr85wdot    endp
  284.  
  285.  
  286. fr85wbox    proc    near uses si
  287.  
  288.     sub    ax, cx
  289.     inc    ax            ; BDT patch 11/4/90
  290. ;    add    ax, xadj
  291.     add    cx, xadj
  292.     add    dx, yadj
  293.     mov    chn + 2, si        ;point to data
  294.     mov    chn + 6, ax
  295.     mov    bbw + 4, ax        ;define the rectangle
  296. ;    mov    bbw + 6, 1        ;set in declaration
  297.     mov    bbw + 8, cx
  298.     mov    bbw + 10, dx
  299.  
  300.     mov    si, offset bbw
  301.     mov    ax, HBBW
  302.     call    callafi
  303.  
  304.     mov    si, offset chn
  305.     mov    ax, HBBCHN
  306.     call    callafi
  307.  
  308.     ret
  309.  
  310. fr85wbox    endp
  311.  
  312.  
  313. fr85rdot    proc    near uses si
  314.  
  315.     mov    bbr + 4, 1        ;define the rectangle
  316. ;    mov    bbr + 6, 1        ;set in declaration
  317.     add    cx, xadj
  318.     add    dx, yadj
  319.     mov    bbr + 10, cx
  320.     mov    bbr + 12, dx
  321.     mov    si, offset bbr
  322.     mov    ax, HBBR
  323.     call    callafi
  324.  
  325.     mov    si, offset chn
  326.     mov    word ptr [si + 2], offset linedata
  327.     mov    word ptr [si + 6], 1    ;send the data
  328.     mov    ax, HBBCHN
  329.     call    callafi
  330.  
  331.     mov    al, linedata
  332.  
  333. fr85rdotx:
  334.     ret
  335.  
  336. fr85rdot    endp
  337.  
  338. fr85rbox    proc    near uses si
  339.  
  340.     sub    ax, cx
  341.     inc    ax            ; BDT patch 11/4/90
  342. ;    add    ax, xadj
  343.     add    cx, xadj
  344.     add    dx, yadj
  345.     mov    chn + 2, di        ;point to data
  346.     mov    chn + 6, ax
  347.     mov    bbr + 4, ax        ;define the rectangle
  348. ;    mov    bbr + 6, 1        ;set in declaration
  349.     mov    bbr + 10, cx
  350.     mov    bbr + 12, dx
  351.  
  352.     mov    si, offset bbr
  353.     mov    ax, HBBR
  354.     call    callafi
  355.  
  356.     mov    si, offset chn
  357.     mov    ax, HBBCHN
  358.     call    callafi
  359.  
  360.     ret
  361.  
  362. fr85rbox    endp
  363.  
  364.  
  365. w8514pal    proc    near
  366.  
  367.     mov    si, offset dacbox
  368.  
  369.     mov    cx, daccount    ;limit daccount to 128 to avoid fliker
  370.     cmp    cx, 128
  371.     jbe    countok
  372.  
  373.     mov    cx, 128
  374.     mov    daccount, cx
  375.  
  376. countok:                ;now build 8514 pallette
  377.     mov    ax, 256         ;from the data in dacbox
  378.     mov    pal + 4, 0
  379.     mov    di, offset paldata
  380.     cld
  381. cpallp:
  382.     push    ax            ;do daccount at a time
  383.     mov    dx, di
  384.     cmp    ax, cx
  385.     jae    dopass
  386.     mov    cx, ax
  387. dopass:
  388.     mov    pal + 6, cx        ;entries this time
  389.     push    cx
  390. cpallp2:
  391.     push    ds            ;pallette format is r, b, g
  392.     pop    es            ;0 - 255 each
  393.  
  394.     lodsb                ;red
  395.     shl    al, 1
  396.     shl    al, 1
  397.     stosb
  398.     lodsb                ;green
  399.     shl    al, 1
  400.     shl    al, 1
  401.     xchg    ah, al
  402.     lodsb                ;blue
  403.     shl    al, 1
  404.     shl    al, 1
  405.     stosw
  406.     mov    al, 0            ;filler
  407.     stosb
  408.     loop    cpallp2
  409.  
  410.     push    si
  411.     push    di
  412.     push    dx
  413.  
  414.     mov    si, hidata        ;wait for flyback
  415.     mov    ax, HINT
  416.     call    callafi
  417.  
  418.     pop    dx
  419.     mov    pal + 8, dx
  420.  
  421.     mov    si, offset pal        ;load this piece
  422.     mov    ax, HLDPAL
  423.     call    callafi
  424.  
  425.     pop    di
  426.     pop    si
  427.     pop    cx
  428.     add    pal + 4, cx        ;increment the pallette index
  429.     pop    ax
  430.     sub    ax, cx
  431.     jnz    cpallp
  432.  
  433.     ret
  434.  
  435. w8514pal    endp
  436.  
  437.  
  438. ;********************************************************************
  439. ;* 8514/A Hardware Interface Routines
  440. ;* Written by Aaron M. Williams for Fractint
  441. ;* This code may be used freely by anyone for anything and freely distributed.
  442. ;* All routines here are written for a V20 (80186) or better CPU.
  443. ;* All code has been at least partially optimized for a 486 (i.e. pipelining)
  444. ;* The macros were written by Roger Brown for Adex Corporation and have been
  445. ;* placed into the public domain by Adex corporation.
  446. ;*
  447. ;* Special support has been added for the Brooktree RAMDAC, which uses 8
  448. ;* bits for rgb values instead of 6 bits.  This RAMDAC is used only in the
  449. ;* 1280x1024 mode (unless programmed otherwise)
  450. ;*
  451. ;* Completed on 3/8/92
  452.  
  453. ;* Revised by JCO on 4/12/92
  454. ; changed width to wdth and other minor fixes so it would assemble
  455. ;   using MASM 6.0
  456. ; took out duplicate variables, xadj, yadj, linedata
  457. ; took out .model C
  458. ; added VIDEO_TEXT to .code and made procedures near
  459. ; added TRANSY macro for 640x480x16 (512K), but not used
  460. ; w8514hwpal
  461. ;  Changed normal 8514/A routine to slow it down
  462. ; reopen8514hw
  463. ;  Renamed enableHIRES as reopen8514hw
  464. ;  Commented out old reopen8514hw
  465. ; open8514hw
  466. ;  Changed where board is reset so a hung board won't prevent detect of 8514/A
  467. ;  Added load8514dacbox routine to initialize colors
  468. ;  Added detection and setup of 512K 8514/A, use debug=8514 to test on 1 Meg
  469. ;  Changed foreground m